package com.test;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureType;
import com.deepoove.poi.data.Pictures;

/**
 * Word文档图片插入工具类 功能：通过Poi-tl在Word模板指定位置插入图片
 */
public class WordImageInserter {

    /**
     * 主方法：执行Word图片插入操作
     */
    public static void main(String[] args) {
        Path templatePath = Paths.get("D:/word/template.docx"); // 源文档模板路径
        Path outputPath = Paths.get("D:/word/template_temp.docx"); // 新文件路径
        Path inspectorImagePath = Paths.get("D:/word/111.jpg"); // 审核人签名图片
        Path approverImagePath = Paths.get("D:/word/111.jpg"); // 批准人签名图片
        try {
            // 绑定模板占位符与图片渲染对象
            Map<String, Object> dataModel = new HashMap<>();
            Map<String, Object> userInfo = new HashMap<>();
            userInfo.put("head", createPicture(inspectorImagePath)); // 替换{{@Head}}标签
            userInfo.put("approver", createPicture(approverImagePath)); // 替换{{@Approver}}标签
            dataModel.put("age", 12);
            dataModel.put("userInfo", userInfo);

            // 执行文档渲染与图片插入
            try (InputStream templateStream = Files.newInputStream(templatePath);
                    OutputStream tempOutputStream = Files.newOutputStream(outputPath)) {

                // 编译模板并渲染数据
                XWPFTemplate template = XWPFTemplate.compile(templateStream).render(dataModel);

                // 输出到临时文件（避免直接修改原文件导致损坏）
                template.write(tempOutputStream);
                template.close();
            }

            // 原子性替换原文件（保证操作完整性）
//            Files.move(outputPath, templatePath, StandardCopyOption.REPLACE_EXISTING);
            System.out.println("图片插入操作完成，文档已更新");

        } catch (IOException e) {
            System.err.println("文档处理异常：" + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 构建图片渲染对象（支持尺寸自定义）
     * 
     * @param imagePath 图片文件路径
     * @param width     图片宽度（像素）
     * @param height    图片高度（像素）
     * @return 图片渲染对象（可直接用于模板渲染）
     * @throws IOException 图片读取失败时抛出
     */
    private static Object createPicture(Path imagePath) throws IOException {
        // 使用NIO流加载图片，自动识别图片类型（此处显式指定为PNG）
        BufferedImage image = ImageIO.read(Files.newInputStream(imagePath));

        int sWidth = image.getWidth();
        int sHeight = image.getHeight();

        BigDecimal rate = new BigDecimal(120).divide(new BigDecimal(sWidth), 2, BigDecimal.ROUND_HALF_UP);
        int width = new BigDecimal(sWidth).multiply(rate).setScale(0, BigDecimal.ROUND_HALF_DOWN).intValue();
        int height = new BigDecimal(sHeight).multiply(rate).setScale(0, BigDecimal.ROUND_HALF_DOWN).intValue();

        System.out.println("图片宽度：" + width);
        System.out.println("图片高度：" + height);
        return Pictures.ofStream(Files.newInputStream(imagePath), PictureType.PNG).size(width, height) // 自定义图片尺寸
                .create(); // 生成图片渲染实体
    }

}
